/**
 * JavaScript中需要继承的都定义在原型链上。
 */


/**
 * Person的构造函数
 * @param {string} name 
 */
function Person(name){
    //给构造函数添加属性，要使用this，这个this是指向实例化对象的
    //普通属性我们可以直接添加即可，属性值以形参的形式传入，这样具有扩展性
    this.name=name;
}

//继承的属性
Person.prototype.attr =1;

/**
 * SayHello 函数
 * @returns  {string}
 */
//方法不直接添加，而是将其添加在函数的原型对象上，这样函数的所有实例对象自动拥有原型中的方法
//从而可以减少内存空间，从而提高性能
Person.prototype.sayHello = function(){
    return `大家好，我是${this.name}`;
};


/**
 * walk函数
 * @returns  {string}
 */
Person.prototype.walk = function(){
    return `动起来！！！`;
};


/**
 * Teacher 构造函数
 * @param {string} name 
 * @param {string} teaches 
 */
function Teacher(name,teaches){
    Person.call(this,name);//调用原型链上有对象的构造函数
    this.teaches = teaches;
}

//组合继承
//1.确保Teacher原型链继承Person的原型链
Teacher.prototype = Object.create(Person.prototype);
//2.确保Teacher构造器的正确指向,指向Teacher的构造函数
Teacher.prototype.constructor = Teacher;

Teacher.prototype.sayHello = function(){
    return `大家好，我是${this.name},教${this.teaches}课程`;
}